home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
076-100
/
084
/
ed
/
docmd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
4KB
|
267 lines
/*
* Copyright 1987 Brian Beattie Rights Reserved.
*
* Permission to copy and/or distribute granted under the
* following conditions:
*
* 1). No charge may be made other than resonable charges
* for reproduction.
*
* 2). This notice must remain intact.
*
* 3). No further restrictions may be added.
*
*/
#include <stdio.h>
#include "tools.h"
#include "ed.h"
char fname[MAXFNAME];
int fchanged;
docmd(glob)
int glob;
{
static char rhs[MAXPAT];
static TOKEN *subpat;
int c, err, line3;
int i, apflg, pflag, gflag;
int nchng;
char *fptr;
pflag = FALSE;
while(*inptr == SP && *inptr == HT)
inptr++;
c = *inptr++;
switch(c)
{
case NL:
if(nlines == 0)
{
line2 = nextln(curln);
}
curln = line2;
return (1);
break;
case '=':
printf("%6d=\n",line2);
break;
case 'A':
case 'a':
if(*inptr != NL || nlines > 1)
return(ERR);
if(append(line1, glob) < 0)
return(ERR);;
fchanged = TRUE;
break;
case 'C':
case 'c':
if(*inptr != NL)
return(ERR);
if(deflt(curln, curln) < 0)
return(ERR);
if(del(line1, line2) < 0)
return(ERR);
if(append(curln, glob) < 0)
return(ERR);
fchanged = TRUE;
break;
case 'D':
case 'd':
if(*inptr != NL)
return(ERR);
if(deflt(curln, curln) < 0)
return(ERR);
if(del(line1, line2) < 0)
return(ERR);
if(nextln(curln) != 0)
curln = nextln(curln);
fchanged = TRUE;
break;
case 'E':
case 'e':
if(nlines > 0)
return(ERR);
if(fchanged && *inptr != '!')
{
printf("File not saved\n");
return(ERR);
}
if(*inptr == '!')
inptr++;
if(*inptr != ' ' && *inptr != HT && *inptr != NL)
return(ERR);
if((fptr = getfn()) == NULL)
return(ERR);
clrbuf();
if((err = doread(0, fptr)) < 0)
return(err);
strcpy(fname, fptr);
fchanged = FALSE;
break;
case 'I':
case 'i':
if(*inptr != NL || nlines > 1)
return(ERR);
if(append(prevln(line1), glob) < 0)
return(ERR);
fchanged = TRUE;
break;
case 'M':
case 'm':
if((line3 = getone()) < 0)
return(ERR);
if(deflt(curln,curln) < 0)
return(ERR);
if(move(line3) < 0)
return(ERR);
fchanged = TRUE;
break;
case 'P':
case 'p':
if(*inptr != NL)
return(ERR);
if(deflt(curln,curln) < 0)
return(ERR);
if(doprnt(line1,line2) < 0)
return(ERR);
break;
case 'Q':
case 'q':
if(fchanged && *inptr != '!')
{
printf("File not saved\n");
return(ERR);
}
if(*inptr == '!')
inptr++;
if(*inptr == NL && nlines == 0 && !glob)
return(EOF);
else
return(ERR);
case 'R':
case 'r':
if(nlines > 1)
return(ERR);
if(nlines = 0)
line2 = lastln;
if(*inptr != ' ' && *inptr != HT && *inptr != NL)
return(ERR);
if((fptr = getfn()) == NULL)
return(ERR);
if((err = doread(line2, fptr)) < 0)
return(err);
fchanged = TRUE;
break;
case 'S':
case 's':
if(toupper(*inptr) == 'E')
return(set());
while(*inptr == SP || *inptr == HT)
inptr++;
if((subpat = optpat(subpat)) == NULL)
return(ERR);
if((gflag = getrhs(rhs)) < 0)
return(ERR);
if(toupper(*inptr) == 'P')
pflag++;
if(deflt(curln, curln) < 0)
return(ERR);
if((nchng = subst(subpat, rhs, gflag, pflag)) < 0)
return(ERR);
if(nchng)
fchanged = TRUE;
return (1);
case 'W':
case 'w':
apflg = 0;
if(inptr[0] == '>' && inptr[1] == '>')
{
apflg++;
inptr++;
inptr++;
}
if(*inptr != ' ' && *inptr != HT && *inptr != NL)
return(ERR);
if((fptr = getfn()) == NULL)
return(ERR);
if(deflt(1, lastln) < 0)
return(ERR);
if(dowrite(line1, line2, fptr, apflg) < 0)
return(ERR);
fchanged = FALSE;
break;
case 'X':
case 'x':
if(*inptr == NL && nlines == 0 && !glob)
{
if((fptr = getfn()) == NULL)
return(ERR);
if(dowrite(1, lastln, fptr, 0) >= 0)
return(EOF);
}
return(ERR);
case 'Z':
case 'z':
if(deflt(curln,curln) < 0)
return(ERR);
switch(*inptr)
{
case '-':
if(doprnt(line1-21,line1) < 0)
return(ERR);
break;
case '.':
if(doprnt(line1-11,line1+10) < 0)
return(ERR);
break;
case '+':
case '\n':
if(doprnt(line1,line1+21) < 0)
return(ERR);
break;
}
break;
default:
return(ERR);
}
return (0);
}